
math.loop = function(v,min,max)
    if v > max then
        return min
    elseif v < min then
        return max
    else
        return v
    end
end

math.clamp = function(v,min,max)
    if v > max then
        return max
    elseif v < min then
        return min
    else
        return v
    end
end

math.between = function(x,a,b)
    return (a<=x and x<=b) or (b <= x and x <=a)
end

math.bezierat = function(a, b, c, d, t)
    return math.pow(1-t,3)*a + 3*t*math.pow(1-t,2)*b + 3*math.pow(t,2)*(1-t)*c+math.pow(t,3)*d
end

--三阶贝塞尔曲线的切线
math.bezieratTangent = function(a, b, c, d, t)
    return (-3) * math.pow(1-t,2)*a + 3*(math.pow(1-t,2) - 2*t*(1-t))*b + 3*(2*t*(1-t) - math.pow(t,2))*c + 3*math.pow(t,2)*d
end

-- 给定一个值，通过加减（max-min+1）获得一个在min和max之间(包含min，max)的值
-- x 给定的值
-- min 最小值
-- max 最大值
math.checkIn = function(x, min, max)
    local dis = max - min + 1
    if dis > 1 then
        if x < min then
            x = x + math.ceil((min - x)/dis)*dis
        elseif x > max then
            x = x - math.ceil((x - max)/dis)*dis 
        end
    else
        x = min
    end
    return x
end

-- 特殊取余数
-- 如果余数=0，返回split
math.modulo = function(source, split)
    if split == 0 then return 0 end
    local ret = source % split
    if ret == 0 then
        ret = split
    end
    return ret
end